package internal

import (
	"fmt"
	"math/rand"
	"sort"
)

//func main() {
//
//	sortParams := []int{10, 4, 2, 1, 3, 5, 7, 6, 9, 8}
//	horserand(sortParams)
//
//	//list := horserand( sortParams );
//	// fmt.Println(list)
//	// fmt.Println(sortParams)
//
//}

var (
	dmax         = 9   //段最大值
	dmin         = 3   //段最小值
	smin float64 = 0.8 //速度最小
	smax float64 = 1.0 //速度最大
	zmax         = 100 // 总值的最大
	zmin         = 50  // 总值的最小
)

// T 表示进度当前马所在赛道的位置（float32），0 表示当前在开始位置，1表示在终点位置。
// S 表示速度（float32），每个单位前进的量。
// l 表示步长精度（float32）通常是常量，与时间为正相关，表示赛道拆分的精度，例如取0.01，那么赛道就被分为100个单位。
type Item struct {
	s float64
	t float64
}

type ItemList struct {
	items []Item
	index int64
	count float64
}

type ItemSlice []ItemList

func (a ItemSlice) Len() int { // 重写 Len() 方法
	return len(a)
}
func (a ItemSlice) Swap(i, j int) { // 重写 Swap() 方法
	a[i], a[j] = a[j], a[i]
}
func (a ItemSlice) Less(i, j int) bool { // 重写 Less() 方法， 从大到小排序
	return a[j].count < a[i].count
}

func horserand(sortParams []int64) []ItemList {

	var len = len(sortParams)

	var arr []ItemList
	arr = make([]ItemList, 0)
	for i1 := 0; i1 < len; i1++ { //循环10匹马

		duanOffset := dmax - dmin                   //相差6段偏移量
		duanNum := rand.Intn(duanOffset) + dmin     //随机3段 + 3段
		var duanAvg = float64(1) / float64(duanNum) //结果1/6段落平均值
		var list ItemList                           //结果集合
		list.items = make([]Item, 0)

		var count float64 = 0.0
		for i := 0; i < duanNum; i++ { //循环每一匹马段落
			var item Item
			item.t = duanAvg * float64(i)
			item.s = (smax-smin)*rand.Float64() + smin
			fmt.Println(i1, item.t, item.s)
			list.items = append(list.items, item)
			if i > 0 {
				count += (list.items[i].t - list.items[i-1].t) * list.items[i-1].s
			}
		}
		list.count = count         //第一匹马的总位置
		list.index = int64(i1 + 1) //第一匹马

		fmt.Println(list)
		arr = append(arr, list)
		fmt.Println(arr)
	}

	sort.Sort(ItemSlice(arr))
	for i := 0; i < len; i++ { //设置排名
		arr[i].index = sortParams[i]
	}
	return arr
}
